home *** CD-ROM | disk | FTP | other *** search
/ IRIX Patches 1995 September / SGI IRIX Patches 1995 Sep.iso / 5.3_patches / patchSG0000646 / patchSG0000646.idb / etc / sendmail.cf.auto.z / sendmail.cf.auto
Text File  |  1995-09-07  |  37KB  |  1,120 lines

  1. ############################################################################
  2. ############################################################################
  3. ############################################################################
  4. #####
  5. #####            SENDMAIL CONFIGURATION FILE
  6. #####              AUTOCONFIGURING VERSION
  7. #####
  8. ############################################################################
  9. ############################################################################
  10. ############################################################################
  11. #  Copyright (c) 1983 Regents of the University of California.
  12. #  All rights reserved.  The Berkeley software License Agreement
  13. #  specifies the terms and conditions for redistribution.
  14. #
  15. # "$Revision: 1.14 $"
  16. #
  17. # To install this file:
  18. #
  19. #       1) Review the rules preceded by the "??? unusual rule" comment.
  20. #       2) Rename this file to be /etc/sendmail.cf
  21. #    3) Run the command "/etc/init.d/mail start" to restart the
  22. #       sendmail daemon.
  23. #       4) Run the command "/usr/etc/configmail setup" to review and, if
  24. #       necessary, adjust the most important configuration settings.
  25. #
  26. # This file works in conjunction with the sendmail autoconfiguration script
  27. # configmail(1M).  When sendmail parses this file, it will be directed to
  28. # call configmail to obtain the values for all critical macros and classes.
  29. # These values will be calculated at runtime by configmail.
  30. #
  31. # For most mail environments, the calculated default values returned by
  32. # configmail should be sufficient to provide a working sendmail configuration.
  33. # In many cases, this file will allow sendmail to "configure itself" and begin
  34. # working without any user intervention.
  35. #
  36. # In some situations, it may still be necessary or desirable to manually
  37. # configure some of the critical configuration parameters.  It should not,
  38. # however, be necessary to make any changes to this file in order to make
  39. # basic configuration adjustments.  If you want to modify the default
  40. # configuration, verify the current configuration parameter settings,
  41. # or simply get more information about the various configuration parameters
  42. # themselves, see the configmail(1M) manual page.
  43. #
  44. # This file and the accompanying configmail script are provided as an
  45. # example of how to use sendmail's new ability to read macro and class
  46. # definitions from pipes to simplify and automate the sendmail configuration
  47. # process.  Sophisticated sendmail users may wish to expand upon the basic
  48. # scheme presented here.
  49. #
  50. # The remainder of this file is a nearly identical copy of the "default"
  51. # suggested configuration file.  The only difference is that this file
  52. # reads the values of the following macros and classes from the output of
  53. # the configmail script, while the "default" configuration file must be
  54. # edited by hand.
  55. #
  56. # Definitions of user configurable macros and classes:
  57. #
  58. #    D macro and class (local (D)omain name)
  59. #        The D macro defines the local domain name.
  60. #        Define this macro to contain the name of the domain in
  61. #        which this host resides.  If no domains are used, you
  62. #        should make sure that this macro is left empty or comment
  63. #        it out.
  64. #
  65. #        The D class explicitly lists all domains to which this
  66. #        host should send mail directly via the ethernet mailer.
  67. #
  68. #        Mail destined for domains not listed in the D class will
  69. #        be sent via an exchanger, or relay host associated
  70. #        with the destination host in preference to sending it
  71. #        directly to the recipient host.
  72. #
  73. #        Mail destined for domains listed in the D class will be
  74. #        sent directly to the destination host if possible.  No
  75. #        attempt will be made to send the mail via an exchanger,
  76. #        or relay host.
  77. #
  78. #        If this host is a relay or exchanger for a particular
  79. #        domain, that domain should appear in the D class.
  80. #
  81. #        If this host is not an exchanger or relay, this class
  82. #        may be left empty.
  83. #
  84. #    F macro and class ((F)orwarder hostname)
  85. #        The F macro defines the name or alias of the host to which
  86. #        this host will send all mail to unknown hosts or domains.
  87. #        It is strongly suggested that the F macro contiain the
  88. #        fully qualified domain name (FQDN) of the forwarder host.
  89. #
  90. #        The F class contains all known names for the host defined
  91. #        in the F macro.
  92. #
  93. #        Mail will only sent to the forwarder as a last resort in
  94. #        the event that:
  95. #
  96. #            a) this host cannot canonicalize the destination
  97. #               hostname or determine an appropriate relay or mail
  98. #               exchanger to deal with it.
  99. #
  100. #            - or -
  101. #
  102. #            b) the appropriate host or relay or exchanger
  103. #               to which this host will be sending the message
  104. #               turns out to exist outside of the top level
  105. #               domain (see the T macro below).
  106. #
  107. #        If no such host exists, the F macro and class should be
  108. #        left empty.  If this host is the forwarder host, the F macro
  109. #        should contain this host's full hostname while the F class
  110. #        should contain all known names for this host.
  111. #
  112. #        In the event that this host is the forwarder host and one
  113. #        of the above conditions for sending mail on to the forwarder
  114. #        host is met, this host will put messages to unknown hosts or
  115. #        domains out "on the wire" and hope for the best.
  116. #
  117. #    T macro ((T)op level domain)
  118. #        This macro defines the name of the top level of the local
  119. #        domain space.  For example, if this host resides in
  120. #        some subdomain BAR.FOO.COM under the FOO.COM domain, and
  121. #        if all hosts under the FOO.COM domain or any subdomain
  122. #        under the FOO.COM domain are to be considered internal
  123. #        hosts, you would define the T macro to be FOO.COM.
  124. #
  125. #        The top level domain is used in conjunction with the
  126. #        definition of the forwarder host defined in the F macro
  127. #        and class above.  All mail destined to hosts "outside" the
  128. #        top level domain will be sent via the forwarder host.
  129. #
  130. #    K class ((K)illed hosts in the local domain)
  131. #        This class is a list of all known "killed" or "dead" hosts
  132. #        in the local domain.  This list is generally used by relay
  133. #        or exchanger machines to detect mail to no-longer-existent
  134. #        hosts.  If a message is received that is destined for one of
  135. #        these hosts, the dead hostname will be stripped from the
  136. #        address, and the resulting address will be used to send the
  137. #        mail.  In common practice, this means that mail addressed
  138. #        to "user@some.listed.dead.host" will resolve to just "user".
  139. #        The subsequent aliasing step may then expand "user" into
  140. #        something like "user@his.new.host".
  141. #
  142. #    P macro ((P)athalias database)
  143. #        This macro defines the location of the pathalias database.
  144. #
  145. #    w class (Alternate names for the local host)
  146. #        This class is a list of all the names by which the local host
  147. #        is known.  This list is pre-set by the sendmail program to
  148. #        contain the h_name and all h_aliases of the local host as
  149. #        returned by gethostbyname(3N).  If additional aliases are
  150. #        needed for proper mail handling, you should add them to
  151. #        the w class.  Mail addressed to any of the hosts in this list
  152. #        will be treated exactly like mail addressed directly to the
  153. #        local host.
  154.  
  155.  
  156. #####################################
  157. # Parameters which MUST be defined. #
  158. #####################################
  159.  
  160. #### D macro and class #####################################################
  161. # D macro: Our local domain name.
  162. # If domains are not used, delete or comment out this line.
  163. DD|/usr/etc/configmail get localdomain
  164.  
  165. # D class: Domains into which we should send mail directly.
  166. # Explicit list of all domains into which we can and should send mail
  167. # directly (without the use of any forwarder, relay, or exchanger hosts.)
  168. # If this host is a relay or exchanger for a particular domain, that domain
  169. # should be listed here, otherwise this class may be left empty.
  170. FD|/usr/etc/configmail get directdomains
  171.  
  172. #### F macro and class #####################################################
  173. # F macro: Forwarder hostname.
  174. # The F macro must contain the name of the forwarder host.
  175. # If no such host exists this macro should be empty.  If this host is the
  176. # forwarder, this macro should be defined to contain this host's name.
  177. DF|/usr/etc/configmail get forwarder
  178.  
  179. # F class: Alternate forwarder hostnames.
  180. # The F class should contain all known hostnames for the forwarder host
  181. # defined above.  If the F macro is empty, the F class should be empty as
  182. # well.
  183. FF|/usr/etc/configmail get forwarder
  184. FF|/usr/etc/configmail get forwarder -s
  185.  
  186. #### T macro and class #####################################################
  187. # T macro: Our top-level domain name.
  188. # Defines the top level of our local domain space.  Mail to any machines
  189. # which exist in this domain or any sub-domain under this domain will be
  190. # considered local or internal (as opposed to foreign).  It will be
  191. # considered O.K. to query for relay hosts in this domain or any sub-domain
  192. # under this domain.
  193. #
  194. # Mail to any machine which does not exist in this domain or any sub-domain
  195. # under this domain will be sent to the forwarder host (defined above) for
  196. # further disposition.
  197. #
  198. # If you do not use domain addressing, this macro should be left blank.
  199. DT|/usr/etc/configmail get rootdomain
  200.  
  201.  
  202. #### Q macro and class #####################################################
  203. # Q class: No rewrite class.
  204. # Defines the direct domains that a relay machine is not to rewrite for
  205. # outbound electronic mail.  For example, mail originating from a local
  206. # domain, passing through an Internet Relay might rewrite the From: line
  207. # to user@ficticious.domain.  If a local subdomain is defined in class N,
  208. # such as sub.ficticious.domain, the From: line will remain intact (only
  209. # a host name would be stripped off, e.g. user@machine.sub.ficticious.domain 
  210. # would become user@sub.ficticious.domain.
  211. FQ|/usr/etc/configmail get recsubdomains
  212.  
  213. ############################################
  214. # Parameters which MAY need to be defined. #
  215. ############################################
  216.  
  217. #### K class ###############################################################
  218. # Killed machines within the local domain:  These machines have been
  219. # permanently turned off.  All mail for them should be redirected to the
  220. # forwarder.  This class is used by domain forwarders to redirect mail
  221. # to known bad, dead, renamed, etc. hosts.  This class only needs to be
  222. # defined on domain forwarders.
  223. #
  224. # Note that this class can be defined inline via the CK command and/or
  225. # may be read from the sendmail.killed file.
  226. FK|/usr/etc/configmail get deadhosts
  227.  
  228. # Additionally for the K class...
  229. # Many machines generate UUCP return paths which include '!somewhere!' 
  230. # when they get confused.  It is a good idea to make sure that your
  231. # K class contains at least 'somewhere'.
  232. CKsomewhere
  233.  
  234. #### P macro ###############################################################
  235. # Look here for path-alias database.
  236. DP|/usr/etc/configmail get pathalias
  237.  
  238. #### w class ###############################################################
  239. # Alternate names by which this host may be known.
  240. # This class is pre-set to contain the h_name and all h_aliases of this host
  241. # as returned by gethostbyname(3N).  If additional aliases are required,
  242. # they may be added here.
  243. Cw
  244.  
  245. #############################################################
  246. # Other Parameters which come pre-configured and SHOULD NOT #
  247. # need to be redefined.                                     #
  248. #############################################################
  249.  
  250. # Official hostname
  251. Dj$w
  252.  
  253. # R macro: Relay hostname.
  254. # This macro defines the hostname (or an alias) used by
  255. # all hosts which act as relay machines.  Relay machines
  256. # are "forwarders" to known internal domains and are themselves
  257. # defined by the use of this relay hostname as their hostname
  258. # or alias.
  259. #
  260. # This macro comes pre-configured as "relay" which is strongly
  261. # suggested.
  262. #
  263. # This macro must not be left blank although it is not necessary
  264. # for any actual relay machines to be configured in the
  265. # network.
  266. #
  267. # Mail relay hosts implement a sort of "poor man's" MX scheme.
  268. # They may also be useful as an emergency "back-up" to the use
  269. # of MX records.
  270. DR|/usr/etc/configmail get relayname
  271.  
  272. # T class: Our top-level domain name.
  273. # Must be identical to the definition of the T macro above or all hell
  274. # will break loose.  Defined via the T macro, do not touch!
  275. CT$T
  276.  
  277. # V class: UUCP machines
  278. # This class is the list of all machines to which we can send mail
  279. # via UUCP
  280. FV/etc/uucp/Systems %[-_a-zA-Z0-9]
  281.  
  282. # N class: UUCP machines that understand domains
  283. # This class is the list of all machines to which we can send mail
  284. # via UUCP and which understand domain-style addressing.  We don't
  285. # need to rewrite addresses into uucp-style when mailing to these
  286. # machines.
  287. FN/etc/uucp/Systems #domain-machine %s
  288.  
  289.  
  290. ######################
  291. ### Version Number ###
  292. ######################
  293.  
  294. DZ940406.SGI.AUTO
  295.  
  296. ###########################
  297. ## Used for lookup logic ##
  298. ###########################
  299.  
  300. DYFAIL
  301. CY$Y
  302.  
  303. ##########################
  304. ##### Special macros #####
  305. ##########################
  306.  
  307. # my name
  308. DnMAILER-DAEMON
  309.  
  310. # UNIX header format
  311. DlFrom $g  $d
  312.  
  313. # delimiter (operator) characters
  314. Do.:%@!^=/[]
  315.  
  316. # format of a total name
  317. Dq$g$?x ($x)$.
  318.  
  319. # SMTP login message - WARNING - Do not remove the space before $j
  320. De $j Sendmail $v/$Z ready at $b
  321.  
  322.  
  323. ###################
  324. ###   Options   ###
  325. ###################
  326.  
  327. # location of local alias file
  328. OA/etc/aliases
  329.  
  330. # wait up to x (originally ten) minutes for alias file rebuild
  331. Oa9
  332.  
  333. # substitution for space (blank) characters
  334. OB.
  335.  
  336. # (don't) connect to "expensive" mailers
  337. #Oc
  338.  
  339. # default delivery mode (deliver in background)
  340. Odbackground
  341. #Odqueue
  342.  
  343. # temporary file mode
  344. OF0600
  345.  
  346. # default UID
  347. Ou998
  348.  
  349. # default GID
  350. Og998
  351.  
  352. # do "fuzzy" matching on GECOS field
  353. OG
  354.  
  355. # location of help file
  356. OH/etc/sendmail.hf
  357.  
  358. # log level (messages sent to SYSLOG)
  359. #
  360. #    0: No logging.
  361. #    1: Serious system failures and potential security problems.
  362. #    2: Network problems and protocol failures.
  363. #    3: Forwarding and received message errors.
  364. #    4: Minor errors.
  365. #    5: Received messages/message collection stats.
  366. #    6: Creation of error messages, VRFY and EXPN commands.
  367. #    7: Message delivery failures.
  368. #    8: Successful deliveries.
  369. #    9: Messages being deferred (due to a host being down, etc.).
  370. #    10: Alias/forward expansion.
  371. #    12: Connecting hosts.
  372. #    20: Attempts to run locked queue files.
  373. #
  374. #    Note: Each level logs its own information plus all information
  375. #          logged by lower levels.
  376. #
  377. OL1
  378.  
  379. # default network name
  380. ON$D
  381.  
  382. # default messages to old style
  383. Oo
  384. # queue directory
  385. OQ/var/spool/mqueue
  386. # read timeout -- violates protocols
  387. Or2h
  388. # status file
  389. OS/var/sendmail.st
  390. # queue up everything before starting transmission
  391. Os
  392. # default timeout interval
  393. OT7d
  394. # time zone names (V6 only)
  395. # wizard's password
  396. OW*
  397. # load average at which we just queue messages
  398. Ox20
  399. # load average at which we refuse connections
  400. OX25
  401. # rebuild alias file
  402. OD
  403.  
  404. # ??? unusual rule
  405. # Define NIS mail.byaddr (reverse alias) file.
  406. # Also see ruleset 11 below for use of this database.
  407. #OKA%mail.byaddr
  408.  
  409. ###############################
  410. ###   Message precedences   ###
  411. ###############################
  412.  
  413. Pfirst-class=0
  414. Pspecial-delivery=100
  415. Pbulk=-60
  416. Pjunk=-100
  417.  
  418. #########################
  419. ###   Trusted users   ###
  420. #########################
  421.  
  422. Troot
  423. Tdaemon
  424. Tuucp
  425. Tuucpadm
  426.  
  427. #############################
  428. ###   Format of headers   ###
  429. #############################
  430.  
  431. HReceived: $?sfrom $s $.by $j $?rvia $r $.($v/$Z)
  432.     $?ufor $u$. id $i; $b
  433. H?P?Return-Path: <$g>
  434. H?D?Resent-Date: $a
  435. H?D?Date: $a
  436. H?F?Resent-From: $q
  437. H?F?From: $q
  438. H?x?Full-Name: $x
  439. HSubject:
  440. # HPosted-Date: $a
  441. # H?l?Received-Date: $b
  442. H?M?Resent-Message-Id: <$t.$i@$j>
  443. H?M?Message-Id: <$t.$i@$j>
  444. # H?R?Return-Receipt-To: $g
  445.  
  446.  
  447. ###########################
  448. ###   Rewriting rules   ###
  449. ###########################
  450.  
  451.  
  452. #############################################################
  453. # insert this handy debugging line wherever you have problems
  454. #R$*                $:$>99$1
  455.  
  456. ######################################
  457. #  Debugging ruleset - Leave empty.  #
  458. ######################################
  459. S99
  460.  
  461. ################################
  462. #  Sender Field Pre-rewriting  #
  463. ################################
  464. S1
  465.  
  466. ###################################
  467. #  Recipient Field Pre-rewriting  #
  468. ###################################
  469. S2
  470.  
  471. #################################
  472. #  Final Output Post-rewriting  #
  473. #################################
  474. S4
  475.  
  476. R@            $@                handle <> error addr
  477.  
  478. # convert mixed UUCP and domains into UUCP
  479. #    but only in some simple cases where it is not wrong
  480. R$+!$+<@$*>        $:$>5$1!$2<@$3>
  481.  
  482. R$*<$+>$*        $1$2$3                defocus
  483. R@$+:@$+:$+        @$1,@$2:$3            <route-addr> canonical
  484.  
  485.  
  486.  
  487. ###########################
  488. #  Name Canonicalization  #
  489. ###########################
  490. S3
  491.  
  492. # handle "from:<>" special case
  493. R<>            $@@                turn into magic token
  494.  
  495. # basic textual canonicalization -- note RFC733 heuristic here
  496. R$*<$*<$*<$+>$*>$*>$*    $4                3-level <> nesting
  497. R$*<$*<$+>$*>$*        $3                2-level <> nesting
  498. R$*<$+>$*        $2                basic RFC821/822 parsing
  499. #R$+ at $+        $1@$2                "at"->"@" for RFC 822
  500.  
  501. R$j!$+            $1                strip our host name
  502. R$=w!$+            $2                even if it has dots
  503. R$=w.$D!$+        $2
  504.  
  505. # make sure <@a,@b,@c:user@d> syntax is easy to parse -- undone later
  506. R@$+,@$+        @$1:@$2                change all "," to ":"
  507.  
  508. # localize and dispose of route-based addresses
  509. R@$+:$+            $@<@$1>:$2            handle <route-addr>
  510.  
  511. # more miscellaneous cleanup
  512. R$+:$*;@$+        $@$1:$2;@$3            list syntax
  513. R$+:$*;            $@$1:$2;            list syntax
  514. R$*@$+            $:$1<@$2>            focus on domain
  515. R$*<$+@$+>        $1$2<@$3>            move gaze right
  516. R$*<@$+>        $@$1<@$2>            already canonical
  517.  
  518. # convert old-style addresses to a domain-based address
  519. R$-:$+            $@$2<@$1>            host:user
  520. R$+^$+            $1!$2                convert ^ to !
  521. R$-.$+!$+        $@$3<@$1.$2>            host.domain!user
  522. R$-!$+            $@$2<@$1>            host!user (uucp)
  523. R$+%$+            $:$1<@$2>            user%host
  524. R$+<@$+%$+>        $1%$2<@$3>            move gaze right
  525. R$*<@$+>        $@$1<@$2>            now % is canonical
  526. R$-=$+            $@$2<@$1.BITNET>        host=user (bitnet)
  527. #R$-.$+            $@$2<@$1>            host.user (? XXX ?)
  528.  
  529.  
  530.  
  531. #########################
  532. # retry rule for rule 0 #
  533. #########################
  534. # This is used to avoid having to always invoke rule 3 at the start of
  535. #    rule 0, as standard configurations do.  It is invoked to re-start
  536. #    parsing.
  537. S29
  538. R:$*            $:$1                remove routing debris
  539. R<@$*>:@$*        <@$1>,@$2
  540.  
  541. R$+!$+            $:$>5$1!$2            make UUCP style pure
  542.  
  543. R$*<$*>$*        $1$2$3                defocus
  544. R$+            $:$>3$1                make canonical
  545. R$+            $@$>0$1                try rule 0 again
  546.  
  547.  
  548.  
  549. ###########################
  550. # general address parsing #
  551. ###########################
  552. S0
  553.  
  554. # Handle some special cases.....
  555. R@            $#local$:$n            handle <> form
  556. R$*<@[$+]>$*        $:$1<@$[[$2]$]>$3        numeric internet spec
  557.  
  558. # Canonicalize the host name.  Detect any failures.
  559. R$*<@$+>$*        $:$1<@$[$2$:$2.$Y$]>$3
  560.  
  561. # If we successfully canonicalize a hostname, but the result contains
  562. # no dots, make it relative to our domain.
  563. R$*<@$->$*        $1<@$2.$D>$3
  564. R$*<$*.>$*        $1<$2>$3            drop any trailing dot
  565. R$*<$*..$Y>$*        $1<$2.$Y>$3            tidy any double dot
  566.  
  567. R$*<@$D>$*        $#local$:$1
  568.  
  569. # now delete the local info
  570. R$+            $:$>30$1            detect local info
  571. R$*<@@$*>$*        $@$>29$1$3            remove local and retry
  572.  
  573. R<@>$*            $@$>29$1            route strip & retry
  574. R$*<@>            $@$>29$1            strip null & retry
  575.  
  576. # Hostname is now non-local and as canonical as we are going to get.
  577. # If the initial canonicalization step failed, ".FAIL" ($Y) has been
  578. # appended to the hostname.
  579.  
  580. # If the mail is destined for a known dead host, strip that host and
  581. # retry.
  582. R$*<@$=K>$*        $@$>29$1$3
  583. R$*<@$=K.$Y>$*        $@$>29$1$3            even on failures
  584.  
  585. # If the mail is destined for a host in a domain for which we are
  586. # responsible, send it directly.
  587. R$*<@$-.$=D>$*        $#ether$@$2.$3$:$1<@$2.$3>$4
  588.  
  589. # The above is true even if we failed to canonicalize.  We are supposed
  590. # to know how to deal with the message.  If we can't, who can?
  591. R$*<@$-.$=D.$Y>$*    $#ether$@$2.$3$:$1<@$2.$3>$4
  592.  
  593. # If the mail is destined for the forwarder, send it directly.
  594. R$*<@$=F>$*        $#ether$@$2$:$1<@$2>$3
  595.  
  596. # See if an MX record is available for the resulting hostname.
  597. R$*<@$+$~Y>$*        ${@$2$3$:$Y$}^$1^$2$3^$4
  598.  
  599. # Do the MX lookup even on failures since some host may choose to
  600. # advertise itself as an exchanger for some otherwise uncanonicalizable
  601. # hostname.
  602. R$*<@$+.$Y>$*        ${@$2$:$Y$}^$1^$2.$Y^$3
  603.  
  604. # If we fail to find any MX record and the address is of the form:
  605. # user@domain.for.which.we.are.responsible, strip and retry.
  606. R$Y$*^$*^$=D^$*        $@$>29$2$4
  607. R$Y$*^$*^$=D.$Y^$*    $@$>29$2$4
  608.  
  609. # See if we have to use a forwarder to mail to the exchanger.
  610. R$~Y$*^$*        $:$>31@@<@$1$2>^$3        found one!
  611. R@@<@@@$+>$*        $:@@@@$2            use the forwarder
  612. R@@<@@$+>$*        $:@@@$2                we are forwarder
  613.  
  614. # Use the appropriate mailer.
  615. R@@@@$*^$*^$*.$Y^$*    $@$>29@$F:$2@$3$4        use forwarder
  616. R@@@@$*^$*^$*^$*    $@$>29@$F:$2@$3$4
  617.  
  618. R@@@$*^$*^$*.$Y^$*    $#forgnout$@$3$:$2<@$3>$4        exchanger is external
  619. R@@@$*^$*^$*^$*        $#forgnout$@$3$:$2<@$3>$4
  620.  
  621. R@@$*^$*^$*.$Y^$*    $#ether$@$3$:$2<@$3>$4        exchanger is internal
  622. R@@$*^$*^$*^$*        $#ether$@$3$:$2<@$3>$4
  623.  
  624. R$Y^$*^$*^$*        $1<@$2>$3            no (or bad) MX, tidy
  625.  
  626. # If we successfully canonicalized the hostname, but couldn't find any good
  627. # MX record to tell us what to do with the message, see if we should send the
  628. # message on to a forwarder.
  629. R$*<@$*$~Y>$*        $:$>31^$1<@$2$3>$4        mark if canonical
  630. R^$*<@@@$*>$*        $@$>29@$F:$1@$2$3        send to forwarder
  631. R^$*<@@$*>$*        $#forgnout$@$2$:$1<@$2>$3        we are forwarder
  632. R^$*            $:$1                unmark
  633.  
  634. # ??? unusual rule
  635. # Notice news stuffing, and stuff mail for newsgroups into a suitable script
  636. #R$*<@news-stuff.$D>    $#mailnews$:$1
  637. #R$*<@news-stuff.$D.$Y>    $#mailnews$:$1
  638.  
  639. # The message is now either to an uncanonicalizable host, or an internal
  640. # host for which no MX record exists.
  641.  
  642. # For internal hosts, see if there's an appropriate relay
  643. # machine (poor man's MX).
  644.  
  645. # If within our domain space, try "relay".addressee.domain
  646. # (even if we failed to canonicalize)
  647.  
  648. R$*<@$*$=T>$*        $:^<@$[$R.$2$T$:$Y.$2$T$]>$1^$2$T^$4
  649. R$*<@$*$=T.$Y>$*    $:^<@$[$R.$2$T$:$Y.$2$T.$Y$]>$1^$2$T.$Y^$4
  650. R^<@$Y.$-.$*$=T>$*    $:^<@$[$R.$2$T$:$Y.$1.$2$T$]>$4
  651. R^<@$Y.$-.$*$=T.$Y>$*    $:^<@$[$R.$2$T$:$Y.$1.$2$T.$Y$]>$4
  652.  
  653. R^<@$~Y$*>$*^$*^$*    $:$>30<@$1$2>$3^$4^$5
  654. R^<@$Y.$*>$*^$*^$*    $:$2<@$3>$4
  655.  
  656. R<@@$*>$*        $:<@$Y@>$2            check for self
  657.  
  658. R<@$~Y$*>$*^$*.$Y^$*    $#ether$@$1$2$:$3<@$4>$5    strip any .FAIL & bye!
  659. R<@$~Y$*>$*^$*^$*    $#ether$@$1$2$:$3<@$4>$5    bye bye!
  660.  
  661. R<$*>$*^$*^$*        $:$2<@$3>$4            tidy
  662.  
  663. # No appropriate relay (or relay is us). If we successfully
  664. # canonicalized and the resulting hostname is in or under our
  665. # domain, or contains no dots, send it directly.
  666.  
  667. R$*<@$*.$Y>$*        $:$Y^$1<@$2>$3
  668. R$~Y$*<@$*.$D>$*    $#ether$@$3.$D$:$1$2<@$3.$D>$4    bye bye
  669. R$~Y$*<@$->$*        $#ether$@$3$:$1$2<@$3>$4    bye bye
  670.  
  671. # Since we have determined that we may be the relay for the addressee domain,
  672. # see if the addressee host is actually some uncanonicalizable nickname
  673. # for ourselves (canonicalizable nicknames would have been stripped as local
  674. # info at the top of this ruleset).  If so, strip and retry.
  675.  
  676. R$Y^$*            $:$>30$1
  677. R$*<@@$*>$*        $@$>29$1$3
  678.  
  679. # All notion of "uncanonicalized" is now stripped (.FAIL removed from
  680. # addressee hostname).  See if our "uncanonicalizable" host can be found
  681. # in the UUCP maps or if a hard-coded exchanger exists.
  682.  
  683. # From UUCP host to UUCP host
  684. #    "goo.UUCP" is the "goo" in the UUCP maps, which may not be the same
  685. #    as "goo.UUX" which is the goo to which we talk directly.
  686. R$*<@$=V.$D>$*        $:@@$1<@$2.$D>$3
  687. R$*<@$=V.UUX>$*        $:@@$1<@$2.UUX>$3
  688. R$*<@$=V>$*        $:@@$1<@$2.UUX>$3
  689.  
  690. R@@$*<@$*$=N.UUX>$*    $#dom$@$3$:$1<@$2$3>$4
  691. R@@$*<@$*$=N.$+>$*    $#dom$@$3$:$1<@$2$3.$4>$5
  692. R@@$*<@$-.$+>$*        $#uucp$@$2$:$1<@$2>$4
  693.  
  694. #re-alias for dead hosts
  695. R$*<@$=K>$*        $@$>29$1$3
  696.  
  697. # ??? unusual rule
  698. # Talk to Internet forwarders.  In the absence of MX record handling
  699. #    this set of rules implement a useful kludge.  Of course, ...
  700. #R$*<@$*fozul.com>$*    $#forgn$@fozul.com$:$1<@$2fozul.com>$3
  701.  
  702.  
  703. # look for a UUCP/pathalias path to a host
  704. #    "goo.UUCP" is the "goo" in the UUCP maps, which may not be the same
  705. #    as "goo.UUX" which is the goo to which we talk directly.
  706. # ??? unusual rule
  707. #    It is not usually a good idea to send all host names through the maps.
  708. #    IMPORTANT, un-comment at most 1 of the following lines.
  709. R$+<@$->            $:^$1<@$[!$P!$2$]><@$2>
  710. #R$+!$+<@$->            $:^$1!$2<@$[!$P!$3$]><@$3>
  711. #
  712. R$+<@$-.UUCP>            $:^$1<@$[!$P!$2$]><@$2.UUCP>
  713.  
  714. R^$+<@!$P!$=V><@$+>        $@$>29$1@$2
  715. R^$+<@!$P!$-><@$+>        $:$1<@$3>
  716.  
  717. # if UUCP resolution succeeds, start over
  718. R^$+<@$+><@$+>            $@$>29$2!$1
  719.  
  720. # resolve unknown UUCP domains with pathalias
  721. R$+<@$+.UUCP>            $:^$1<@$2><$[!$P!$2$]>
  722. R^$+<@$+><!$P!$*.$D>        $@$>29$1@$2        recognize LOCAL.uucp
  723. R^$+<@$+><!$P!$*>        $:$1<@$2.UUCP>
  724. R^$+<@$+><$*>            $@$>29$3!$2!$1        use generated path
  725.  
  726. # resolve unknown domains with pathalias
  727. R$*<@$+.$+>$*            $:^$1<@$2.$3><$[!$P!$2.$3$]>$4
  728. R^$*<@$+><!$P!$*>$*        $:$1<@$2>$4
  729. R^$*!$*<@$+><$=N>        $@$>29$4!$3!$1!$2    domain to good neighbor
  730. R^$*!$*<@$+><$=N!$+>        $@$>29$4!$3!$1!$2
  731. R^$+<@$+><$=N>            $@$>29@$3:$1@$2
  732. R^$+<@$+><$=N!$+>        $@$>29@$3:$1@$2
  733. R^<@$+><$+!$+>$+        $@$>29@$2:@$1$4        use generated path
  734. R^<@$+><$+>$+            $@$>29@$2:@$1$3
  735. R^$+<@$+><$+>            $@$>29$3!$2!$1
  736. # we cannot convert nasty stuff--where do the !'s go?
  737. R^$*<@$+><$*>$*            $:$1<@$2>$4
  738.  
  739. # O.K.  I give up!  Send this message to someone wiser.
  740.  
  741. # See if we need to use a forwarder.
  742. R$*<@$*>$*        $:$>31$1<@$2>$3
  743. R$*<@@@$*>$*        $@$>29@$F:$1@$2$3        send to forwarder
  744. R$*<@@$*>$*        $#forgnout$@$2$:$1<@$2>$3        we are forwarder
  745.  
  746. # Destination is internal.  Try "relay".our.domain
  747. R$*<@$*>$*        $:$>30<@$[$R.$D$:$Y$]>$1^$2^$3
  748. R<@@$*>$*        $:<@$Y@>$2            check for self
  749. R<@$~Y$*>$*^$*^$*    $#ether$@$1$2$:$3<@$4>$5    bye bye!
  750. R<$*>$*^$*^$*        $:$2<@$3>$4            tidy
  751.  
  752. # Message is rated PG (Parental Guidance suggested)...
  753. # First, determine our domain's location relative to the top level.
  754. R$*<@$*>$*        $:$D^$1^$2^$3
  755. R$*$=T^$*        $:$1^$3
  756. R$*.^$*            $:$1^$2
  757.  
  758. # If our domain isn't the top domain, try and send this message
  759. # to "relay".our.parent.domain
  760. R$+.$+^$*        $:$>30<@$[$R.$2$T$:$Y$]>$1.$2^$3
  761. R<@@$*>$*        $:<@$Y@>$2            check for self
  762. R<@$~Y$*>$*^$*^$*^$*    $#ether$@$1$2$:$4<@$5>$6    bye bye!
  763. R<$*>$*^$*        $:$2^$3
  764. R$+^$*            $:$>30<@$[$R.$T$:$Y$]>$1^$2
  765. R<@@$*>$*        $:<@$Y@>$2            check for self
  766. R<@$~Y$*>$*^$*^$*^$*    $#ether$@$1$2$:$4<@$5>$6    bye bye!
  767. R<$*>$*^$*        $:$2^$3
  768.  
  769. # If the top domain isn't our domain, or our immediate parent domain,
  770. # try and send this message to "relay".top.domain
  771. R$+.$+^$*        $:$>30<@$[$R.$T$:$Y$]>$1.$2^$3
  772. R<@@$*>$*        $:<@$Y@>$2            check for self
  773. R<@$~Y$*>$*^$*^$*^$*    $#ether$@$1$2$:$4<@$5>$6    bye bye!
  774.  
  775. # Try just "relay"
  776. R<$*>$*            $:$2
  777. R$*^$*^$*^$*        $:$2^$3^$4
  778. R$*^$*^$*        $:$>30<@$[$R$:$Y$]>$1^$2^$3
  779. R<@@$*>$*        $:<@$Y@>$2            check for self
  780. R<@$~Y$*>$*^$*^$*    $#ether$@$1$2$:$3<@$4>$5    bye bye!
  781. R<$*>$*^$*^$*        $:$2<@$3>$4
  782. R^$*^$*^$*        $:$1<@$2>$3
  783. R$*<@$*$=T>$*        $#ether$@$2$3$:$1<@$2$3>$4    BOING!?!?
  784.  
  785. # Send completely unknown, external-looking stuff to the forwarder.
  786. R$*<@$*>$*        $:$>30<@$F>$1^$2^$3
  787. R<@@$*>$*        $:<@$Y@>$2            check for self
  788. R<@$~Y$*>$*^$*^$*    $@$>29@$F:$3@$4$5        bye bye!
  789. R<$*>$*^$*^$*        $:$1<@$2>$3
  790.  
  791. # Drat!  Not much else we can do! 
  792. # Complain about unknown machines and domains
  793. R$*<@$*>$*        $#ether$@$2$:$1<@$2>$3        BOING!?!?
  794.  
  795. # everything else must be a local name or alias
  796. R$*            $#local$:$1
  797.  
  798. ################################
  799. # convert to UUCP style routes #
  800. ################################
  801. S5
  802. R$*<$+>$*        $1$2$3            defocus
  803. R@$+:@$+:$+        @$1,@$2:$3        <route-addr> canonical
  804. R@$+,@$+        @$1!$2            @a,@b:user@c to @a!b:user@c
  805. R@$+:$+@$+        $:$1!$3!$2        @a!b:user@c to a!b!c!user
  806. R$+@$+            $2!$1            simple domain address
  807.  
  808. R$-.UUCP!$+        $1!$2
  809. R$-.UUX!$+        $1!$2
  810.  
  811.  
  812. ########################
  813. # strip internal paths #
  814. ########################
  815. S7
  816. R$*            $:$>5$1                convert to UUCP style
  817.  
  818. # remove our name for mailers which will add our hostname in any case
  819. R$=w!$+            $@$>7$2
  820. R$j!$+            $@$>7$1
  821.  
  822.  
  823. ##################################
  824. # resolve unknown UUCP addresses #
  825. ##################################
  826. S8
  827. R$*<@$*$D>$*            $@$1<@$2$D>$3        recognize our domain
  828. R$*<@$=w.UUCP>$*        $@$1<@$2.UUCP>$3
  829.  
  830. R$*<@$=V.UUCP>$*        $@$1<@$2.UUCP>$3    notice our modems
  831.  
  832. R$*                $:$w!$1            prepend "ourself!"
  833. R$~F!$*                $@$2            quit if not a forwarder
  834. R$~F.$+!$*            $@$3
  835. R$+!$*                $:$2
  836.  
  837. # look for a path to a host
  838. R$*<@$-.UUCP>            $:!!$1<@$[!$P!$2$]>
  839. R!!$*<@!$P!$->            $@$1<@$2.UUCP>
  840. R!!$*<@$*>            $@$2!$1            use generated path
  841.  
  842. # resolve unknown UUCP domains
  843. R$*<@$+.UUCP>            $:!!$1<@$2><$[!$P!$2$]>
  844. R!!$*<@$+><!$P!$+>        $@$1<@$2.UUCP>
  845. R!!$*<@$+><$+>            $@$3!$2!$1        use generated path
  846.  
  847. # resolve unknown domains
  848. R$*<@$+.$+>            $:!!$1<@$2.$3><$[!$P!$2.$3$]>
  849. R!!$*<@$+><!$P!$*>        $@$1<@$2>
  850. R!!<@$+><$+>            $@$2!$1
  851. R!!$+<@$+><$+>            $@$3!$2!$1
  852.  
  853.  
  854. ############################################################
  855. ############################################################
  856. #    Useful utilities
  857. ############################################################
  858. ############################################################
  859.  
  860. # S30 - Detect our hostname
  861. # If the hostname in focus is us, mark it by doubling the "@"
  862. # if so.  Canonicalization falures are of no consequence here.
  863. # Ignore appended $Y's.
  864. S30
  865. # ??? - unusual rule
  866. # Find other names for ourself.
  867. #    XXX this should be handled in the $=w class.
  868. #R$*<@alternatename.foo.com>$*        $@$1<@@$j>$2
  869. #R$*<@alternatename.foo.com.$Y>$*    $@$1<@@$j>$2
  870.  
  871. R$*<@>$*        $@$1<@@>$2            null host is thishost
  872. R$*<@.$Y>$*        $@$1<@@.$Y>$2             ignore failures
  873. R$*<@$=w>$*        $@$1<@@$2>$3            alternate names
  874. R$*<@$=w.$Y>$*        $@$1<@@$2.$Y>$3             ignore failures
  875. R$*<@$j>$*        $@$1<@@$j>$2            this host
  876. R$*<@$j.$Y>$*        $@$1<@@$j.$Y>$2             ignore failures
  877.  
  878. # ??? - unusual rule
  879. # Uncomment the following lines if you don't have a wildcard MX record for
  880. # the LOCAL domain and if you want to treat foo@LOCAL as foo@THISHOST.
  881. #R$*<@$D>$*        $@$1<@@$D>$2            LOCAL
  882. #R$*<@$D.$Y>$*        $@$1<@@$D.$Y>$2             ignore failures
  883. #R$*<@.$D>$*        $@$1<@@.$D>$2            .LOCAL
  884. #R$*<@.$D.$Y>$*        $@$1<@@.$D.$Y>$2         ignore failures
  885.  
  886. R$*<@$=w.UUCP>$*    $@$1<@@$2.UUCP>$3        thishost.UUCP
  887. R$*<@$=w.UUCP.$Y>$*    $@$1<@@$2.UUCP.$Y>$3         ignore failures
  888. R$*<@$j.UUCP>$*        $@$1<@@$j.UUCP>$2
  889. R$*<@$j.UUCP.$Y>$*    $@$1<@@$j.UUCP.$Y>$2
  890.  
  891. # S31 - See if we should use the forwarder
  892. # Return with the "@" in front of the focused host modified as follows:
  893. #    unchanged - host is internal, use of forwarder should be unnecessary.
  894. #    @ -> @@   - host is external and we are the forwarder or forwarder
  895. #            loop detected.
  896. #    @ -> @@@  - host is external and we are not the forwarder.
  897. S31
  898. # If no top level domain, treat as internal...
  899. R$*            $:<@$T@>$1
  900. R<@$=T@>$*        $:$2
  901. R<@$*@>$*        $@$2
  902.  
  903. R$*<@$*$=T>$*        $@$1<@$2$T>$4            not external
  904. R$*            $:$>30<@$F>$1
  905. R<@@$*>$*<@$*>$*    $@$2<@@$3>$4            we're the forwarder
  906. R<@$*>$*<@$=F>$*    $@$2<@@$3>$4            forwarder loop, send!
  907. R<@$*>$*<@$*>$*        $@$2<@@@$3>$4            send to forwarder!
  908.  
  909. ############################################################
  910. ############################################################
  911. #####
  912. #####        Local and Program Mailer specification
  913. #####
  914. ############################################################
  915. ############################################################
  916.  
  917. Mlocal, P=/bin/mail, F=EDFMlsmhu, S=10, R=20, A=mail -s -d $u
  918. Mprog,    P=/bin/sh,   F=lsDFMe, S=10, R=20, A=sh -c $u
  919.  
  920. S10
  921. R$+!$+            $:$>7$1!$2            clean UUCP style
  922. # ??? unusual rule
  923. # In the interest of brevity and aesthetics, the following four rewrite
  924. # rules attempt to strip any local host and/or domain name from all sender
  925. # addresses prior to final delivery.  If this behaviour is not desired,
  926. # comment out the following four rewrite rules, and all sender addresses
  927. # will appear in their fully canonical form.
  928. R$*<@$j>        $@$1
  929. R$*<@$=w>        $@$1
  930. R$*<@$=w.$D>        $@$1
  931. R$*<@$-.$D>        $1<@$2>
  932.  
  933. S20
  934. R$+!$+            $:$>7$1!$2            clean UUCP style
  935. R$*<@>            $@$1
  936. # ??? unusual rule
  937. # In the interest of brevity and aesthetics, the following four rewrite
  938. # rules attempt to strip any local host and/or domain name from all recipient
  939. # addresses prior to final delivery.  If this behaviour is not desired,
  940. # comment out the following four rewrite rules, and all recipient addresses
  941. # will appear in their fully canonical form.
  942. R$*<@$j>        $@$1
  943. R$*<@$=w>        $@$1
  944. R$*<@$=w.$D>        $@$1
  945. R$*<@$-.$D>        $1<@$2>
  946.  
  947.  
  948. ############################################################
  949. ############################################################
  950. #####
  951. #####        Ethernet Mailer specification
  952. #####
  953. ############################################################
  954. ############################################################
  955.  
  956. Mether,    P=[IPC], F=mDFMhuXC, S=11, R=21, E=\r\n, A=IPC $h
  957.  
  958. S11
  959. # Canonicalize any hostname.  Mark failures.
  960. R$*<@$+>$*        $:$1<@$[$2$:$2.$Y$]>$3
  961.  
  962. # If successfully canonicalize to single-token hostname, make relative
  963. # to our local domain.
  964. R$*<@$->$*        $:$1<@$2.$D>$3
  965.  
  966. # Tidy up a bit.
  967. R$*<@$+.$Y>$*        $:$1<@$2>$3        strip any .FAIL
  968. R$*<@$+.>$*        $1<@$2>$3        strip any trailing dot(s)
  969.  
  970. # ??? unusual rule
  971. # Try and match the whole gory thing in the reverse aliases map.
  972. # Also see OKA database definition above.
  973. #R$*            $:^$1
  974. #R^$*<@$*>$*        $:$(A$1@$2$3$:$1<@$2>$3$)
  975. #R^$+            $:$(A$1$:$1$)
  976.  
  977. R$+!$+            $:$>7$1!$2        clean UUCP style
  978. R$-<@$=V>        $2!$1            convert UUCP neighbors
  979. R$+!$+            $:$w!$1!$2        tack on our hostname
  980. R$+!$+            $@$>5$1!$2
  981. R$*<@$+>$*        $@$1<@$2>$3
  982. R$+            $@$1<@$j>
  983.  
  984. S21
  985. R$+!$+            $@$>5$1!$2        make UUCP style pure
  986. R$+<@[$+]>        $@$1<@[$2]>        pass IP numbers
  987.  
  988. # Canonicalize any hostname.  Mark failures.
  989. R$*<@$+>$*        $:$1<@$[$2$:$2.$Y$]>$3
  990.  
  991. # If successfully canonicalize to single-token hostname, make relative
  992. # to our local domain.
  993. R$*<@$->$*        $:$1<@$2.$D>$3
  994.  
  995. # Tidy up a bit.
  996. R$*<@$+.$Y>$*        $:$1<@$2>$3        strip any .FAIL
  997. R$*<@$+.>$*        $1<@$2>$3        strip any trailing dot(s)
  998.  
  999. R$-<@$=V>        $@$>5$1<@$2>        convert UUCP short hand
  1000. R$-            $:$1<@$j>
  1001.  
  1002.  
  1003. ############################################################
  1004. ############################################################
  1005. #####
  1006. #####        UUCP Mailer specifications
  1007. #####
  1008. ############################################################
  1009. ############################################################
  1010.  
  1011.  
  1012. # Domain UUCP, which can take >1 destination per transaction, and understands
  1013. #    domains.  These guys like 'remote from' lines, unlike ethernet users.
  1014. Mdom, P=/usr/bin/uux, F=sDFMhumUC, S=13, R=23, A=uux - $h!rmail ($u)
  1015.  
  1016. S13
  1017. R$*<@$-.UUCP>        $:$>7$1<@$2.UUCP>
  1018. R$*            $:$>11$1
  1019. R$-.$D!$+        $1!$2            remove our domain if UUCP
  1020.  
  1021. S23
  1022. R<@$+>$+        $:$>5<@$1>$2        822 route to UUCP route
  1023. R$*<@$-.UUCP>        $:$>5$1<@$2.UUCP>
  1024. R$*<@$-.UUX>        $:$>5$1<@$2.UUCP>
  1025. R$*            $@$>21$1
  1026.  
  1027.  
  1028. # dumb UUCP to the great, outside world
  1029. #    Notice we assume they can handle >1 addressee / msg
  1030. Muucp, P=/usr/bin/uux, F=sDFMhumUC, S=14, R=24, A=uux - $h!rmail ($u)
  1031.  
  1032. S14
  1033. R$*            $:$>7$1            convert to UUCP style
  1034. R$*            $:$w!$1            add gateway name
  1035. R$-.$D!$+        $1!$2            remove our domain
  1036.  
  1037. S24
  1038. R$+            $:$>8$1            resolve uucp hosts
  1039. R$*            $:$>5$1            convert to UUCP style
  1040.  
  1041.  
  1042.  
  1043. ############################################################
  1044. ############################################################
  1045. #####
  1046. #####        Usenet 'Mailer' specification
  1047. #####
  1048. ############################################################
  1049. ############################################################
  1050.  
  1051. # ??? unusual rule
  1052. # stuff news articles into local news groups
  1053. Mmailnews, P=/usr/lib/news/mailnews, F=lsDFemC, S=15, R=25, A=mailnews $u
  1054.  
  1055. S15
  1056. R$+!$+            $:$>7$1!$2            clean UUCP style
  1057.  
  1058. S25
  1059. R$+!$+            $:$>7$1!$2            clean UUCP style
  1060.  
  1061.  
  1062.  
  1063. ############################################################
  1064. ############################################################
  1065. #####
  1066. #####        Foreign TCP/SMTP Mailer specification
  1067. #####
  1068. ############################################################
  1069. ############################################################
  1070.  
  1071. # This is the same as the local ethernet mailer.
  1072. Mforgn,    P=[IPC], F=mDFMhuXC, S=16, R=21, E=\r\n, A=IPC $h
  1073.  
  1074. S16
  1075. R$*            $:$>11$1    same as normal ethernet
  1076.  
  1077. # ??? unusual rule
  1078. # Rewrite From: lines to hide internal domains (the infamous "%-hack".)
  1079. #R$-<@$j>        $@$1<@$j>
  1080. #R$-<@$+.$D>        $@$1%$2.$D<@$j>
  1081. #R$-<@$+.$D>        $@$1%$2<@$D>
  1082.  
  1083.  
  1084. #S26
  1085. #R$*            $@$>21$1    same as normal ethernet
  1086.  
  1087.  
  1088. ############################################################
  1089. ############################################################
  1090. #####
  1091. #####        OUTBOUND Foreign TCP/SMTP Mailer specification
  1092. #####
  1093. ############################################################
  1094. ############################################################
  1095.  
  1096. # This is the mailer for outbound traffic
  1097. Mforgnout,    P=[IPC], F=mDFMhuXC, S=37, R=21, E=\r\n, A=IPC $h
  1098.  
  1099. S37
  1100. # Canonicalize any hostname.  Mark failures.
  1101. R$*<@$+>$*        $:$1<@$[$2$:$2.$Y$]>$3
  1102.  
  1103. # If successfully canonicalize to single-token hostname, make relative
  1104. # to our local domain.
  1105. R$*<@$->$*        $:$1<@$2.$D>$3
  1106.  
  1107. # Tidy up a bit.
  1108. R$*<@$+.$Y>$*        $:$1<@$2>$3        strip any .FAIL
  1109. R$*<@$+.>$*        $1<@$2>$3        strip any trailing dot(s)
  1110.  
  1111. R$+!$+            $:$>7$1!$2        clean UUCP style
  1112. R$-<@$=V>        $2!$1            convert UUCP neighbors
  1113. R$+!$+            $:$w!$1!$2        tack on our hostname
  1114. R$+!$+            $@$>5$1!$2
  1115. #R$*<@$+>$*        $@$1<@$2>$3
  1116. #R$+            $@$1<@$j>
  1117. R$*<@$+.$=Q.$T>        $@$1<@$Q.$T>
  1118. R$*<@$+>$*        $@$1<@$D>
  1119. R$+            $@$1<@$D>
  1120.